#!/bin/sh
# Diapason Studio for macOS: installs the page shipped in the app, replaces it with a newer one
# from the website when there is one, then opens it in its own window.
VERSION="1.5.0"
BASE="https://diapasonstudio.netlify.app/"
RES="$(cd "$(dirname "$0")/../Resources" && pwd)"
DIR="$HOME/Library/Application Support/DiapasonStudio"
PAGE="$DIR/diapason.html"
VERFILE="$DIR/version.txt"

LANGUE="$(defaults read -g AppleLocale 2>/dev/null)"; LANGUE="${LANGUE%%_*}"
fail() {
  TITRE="$(case "$LANGUE" in en) echo "Diapason Studio could not start";; es) echo "Diapason Studio no pudo iniciarse";; de) echo "Diapason Studio konnte nicht gestartet werden";; pt) echo "Não foi possível iniciar o Diapason Studio";; *) echo "Diapason Studio n’a pas pu démarrer";; esac)"
  osascript -e 'on run argv' -e 'display alert (item 1 of argv) message (item 2 of argv) as critical' -e 'end run' "$TITRE" "$1" >/dev/null 2>&1
  exit 1
}

# True when version $1 is greater than version $2
newer() {
  awk -v a="$1" -v b="$2" 'BEGIN { split(a, x, "."); split(b, y, "."); for (i = 1; i <= 3; i++) { if (x[i] + 0 > y[i] + 0) exit 0; if (x[i] + 0 < y[i] + 0) exit 1 } exit 1 }'
}

mkdir -p "$DIR" || fail "$(case "$LANGUE" in en) echo "Cannot create the folder";; es) echo "No se puede crear la carpeta";; de) echo "Der Ordner kann nicht erstellt werden:";; pt) echo "Não é possível criar a pasta";; *) echo "Impossible de créer le dossier";; esac) $DIR."

# Keep a newer version downloaded earlier; otherwise install the one shipped inside the app
LOCAL=""
[ -f "$PAGE" ] && [ -f "$VERFILE" ] && LOCAL="$(tr -d ' \r\n' < "$VERFILE")"
if [ -z "$LOCAL" ] || newer "$VERSION" "$LOCAL"; then
  cp "$RES/diapason.html" "$PAGE" || fail "$(case "$LANGUE" in en) echo "Cannot copy the page to";; es) echo "No se puede copiar la página en";; de) echo "Die Seite kann nicht kopiert werden nach";; pt) echo "Não é possível copiar a página para";; *) echo "Impossible de copier la page dans";; esac) $DIR."
  printf '%s\n' "$VERSION" > "$VERFILE"
  LOCAL="$VERSION"
fi
cp "$RES/logo.svg" "$DIR/logo.svg" 2>/dev/null

# Download the latest page from the website when it is newer; silently does nothing when offline
STAMP="$(date +%s)"
REMOTE="$(curl -fsSL --max-time 4 "${BASE}version.json?t=$STAMP" 2>/dev/null | tr -d '\r\n' | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([0-9.]*\)".*/\1/p')"
if [ -n "$REMOTE" ] && newer "$REMOTE" "$LOCAL"; then
  TMP="$PAGE.tmp"
  if curl -fsSL --max-time 30 -o "$TMP" "${BASE}index.html?t=$STAMP" 2>/dev/null \
    && [ "$(wc -c < "$TMP")" -gt 10000 ] && grep -q "const APP_VERSION" "$TMP"; then
    mv -f "$TMP" "$PAGE" && printf '%s\n' "$REMOTE" > "$VERFILE"
  fi
  rm -f "$TMP"
fi

URL="file://$(printf '%s' "$PAGE" | sed 's/%/%25/g; s/ /%20/g; s/#/%23/g; s/?/%3F/g')"

# A dedicated profile keeps the saved presentation separate and opens a window without browser chrome
for APP in "Google Chrome" "Microsoft Edge" "Brave Browser" "Chromium" "Vivaldi"; do
  for ROOT in /Applications "$HOME/Applications"; do
    if [ -d "$ROOT/$APP.app" ]; then
      exec open -na "$ROOT/$APP.app" --args --app="$URL" --user-data-dir="$DIR/profil" \
        --no-first-run --no-default-browser-check --window-size=1440,900
    fi
  done
done

# No Chromium browser: the default browser (Safari) opens the page
open "$PAGE" || fail "$(case "$LANGUE" in en) echo "No browser could open";; es) echo "Ningún navegador pudo abrir";; de) echo "Kein Browser konnte Folgendes öffnen:";; pt) echo "Nenhum navegador conseguiu abrir";; *) echo "Aucun navigateur n’a pu ouvrir";; esac) $PAGE."
